面試題分享【不斷更新】


問題1:求以下程序段的輸出

int test(int x, int y)
{
    x = x + y;
    return x * y;
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        int x = 3, y = 10, z = test(x, y);
        NSLog(@"%d%d", x++, ++z);
    }
    return 0;
}

答案:3131


問題2:求以下程序段的輸出

int func(int x)
{
    int countx = 0;
    while (x) {
        countx++;
        x = x&(x-1);
    }
    return countx;
}

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        
        NSLog(@"%d", func(2013));
    }
    return 0;
}

答案:9


 

問題3:簡述兩個for循環的優缺點

for (i = 0; i < N; i++) {
    if (condition) {
        doSomeThing();
    } else {
        doOtherThing();
    }
}

if (condition) {
    for (i = 0; i < N; i++) {
        doSomeThing();
    }
} else {
    for (i = 0; i < N; i++) {
        doOtherThing();
    }
}

答案:無


 

問題4:請指出下面代碼的問題

UIView *tmpView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.view addSubview:tmpView];

答案:無


 

問題5:你所了解的單例有哪些?請寫了一個單例的示例代碼。

答案:

@interface Manager : NSObject
+ (id)sharedManager;
@end
static Manager *instance = nil;

@implementation Manager

+ (id)sharedManager
{
    if (!instance) {
        instance = [[super allocWithZone:NULL] init];
    }
    return instance;
}

// 復寫allocWithZone和copyWithZone的目的是在外部多次調用alloc的時候,內部能夠確保對象只創建了一次

+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedManager] retain];
}

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

// 復寫retain、retainCount、release、autorelease避免單件對象被外部釋放
- (id)retain
{
    return self;
}

- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}

- (void)release
{
    
}

- (id)autorelease
{
    return self;
}

 


問題6:在你的日常開發過程中,是否遇到過崩潰問題?怎么解決?

答案:無


問題7:請寫出使用委托(代理)的示例代碼。

答案:

A委托B

A.h

@protocol ADelegate;
@interface A : NSObject

@property (nonatomic, assign) id<ADelegate> delegate;

- (void)go;

@end

@protocol ADelegate <NSObject>

- (void)doSomeThing;

@end

A.m

@implementation A

- (void)go
{
    if ([_delegate respondsToSelector:@selector(doSomeThing)]) {
        [_delegate doSomeThing];
    }
}

@end

B.h

#import "A.h"

@interface B : NSObject<ADelegate>

@end

B.m

@implementation B

- (void)doSomeThing
{
    NSLog(@"do something...");
}

@end

man.m

#import "A.h"
#import "B.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        A *a = [[A alloc] init];
        B *b = [[B alloc] init];
        a.delegate = b;
        
        [a go];
        
        [a release];
        [b release];
        
    return 0;
    }
}

// 輸出

do something...


問題8:寫出控制器加載視圖的常規調用方法流程。

答案:

loadView

viewDidLoad

viewWillAppear

viewWillLayoutSubviews

viewDidLayoutSubviews

viewDidAppear


問題9:Objective-C有多重繼承么?不是的話,請以示例代碼說明。

答案:無


問題10:請寫出下面代碼的打印結果(默認在32位機器下運行)。

char a[] = "hello world";
char *p = a;
NSLog(
@"%ld", sizeof(a)); NSLog(@"%ld", sizeof(p));

答案:

12

4

如果在64位機器上運行

12

8


問題11: 請完成下面的函數

@interface NSCustomArray : NSArray
@property (nonatomic, retain) NSArray *targets;
- (void)updateTargetsByArray:(NSArray *)newArray; // 將newArray賦值給targets
@end
@implementation NSCustomArray

- (void)updateTargetsByArray:(NSArray *)newArray
{
    NSArray *tmpArray = [[NSArray alloc] initWithArray:newArray];
    // 將tmpArray賦值給targets
}
@end

答案:無


 

問題12:檢查如下代碼是否有問題,如果有問題,正確的寫法是?

- (void)setTarget:(NSObject *)target
{
    self.target = target;
}

答案:無


 

問題13:指出下面代碼的問題

- (void)willEndStepOne:(NSObject *)userInfo
{
    [NSThread detachNewThreadSelector:@selector(doSomeThing:) toTarget:self withObject:userInfo];
}

- (void)doSomeThing:(NSObject *)userInfo
{
    int max_loop_times = 999999;
    for (int i=0; i<max_loop_times; i++) {
        int randNum = rand();
        NSString *tmpString = [NSString stringWithFormat:@"%d", randNum];
        NSLog(@"%@", tmpString);
    }
}

答案:無 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM