【objective-c】初次學習objective-c問題彙總... 【暫完,待修改錯誤】

---------------------------------------------------------------------------------------- java

    這本書,我已經看過兩遍,那兩遍都是在買mac pro以前看的,目的是...由於語法怪怪的頗有趣。
    好吧,也許仍是有那麼點歪心思的,如今買了電腦,第三遍看了,(⊙o⊙)…の,實踐了才知道,中間會遇到這麼多很糾結的問題。不過還好,速度比以前看要快不少不少了。。。 android

  是分割線 c++

    終於所有實踐了一次並寫了一些小小的東西,不過仍是不太熟練。接下來會繼續看另一本很基礎的書,不過這本書就不會作筆記了,同時會跟着新買的一本口碑超讚的書進行實踐練習,會有新筆記的。
    這篇筆記估計不會有太多的更新了,但若是在後面的學習和回顧中發現筆記裏有錯誤的理解和見解,會進行修改與調整的。
    若是在看這篇筆記的你發現有什麼問題,必定記得給我評論留言指出,O(∩_∩)O謝謝了!~
程序員

---------------------------------------------------------------------------------------- web

理解不透的問題: objective-c

一、內存管理:雖然說能夠自動管理內存,可是過來人說這個必需要懂,要很是懂。。。 express

二、類別和委託 小程序

三、NSCoding :對象的編碼和解碼 數組

四、併發 xcode

五、NSPredicate

----------------------------------------------------------------------------------------

單獨拎出來的概念:

開閉原則(Open / Closed Principle)

----------------------------------------------------------------------------------------

一、在xcode中沒法在一個窗口打開多個項目,每一個窗口只能存在一個項目。

  解決方案:cmd+~,就是tab上面一個鍵,能夠在項目中快速切換。

二、conflicting types for ‘方法名’ 的錯誤。(Objective-C基礎教程第三章中第一個實例練習時出錯)

  解決方案:這裏走的是C的語法,每一個被調用的函數都須要在調用以前被聲明。

三、Must explicitly describe intended ownership of an object array parameter(Objective-C基礎教程第三章中最後一個實例練習時出錯)


進行到第三章最後一個實例時,cmd+r運行會報錯:Must explicitly describe intended ownership of an object array parameter。若是你看到了這個錯誤信息,你能夠選中左邊的項目名,而後再選中右邊的PROJECT-->Apple LLVM compiler 4.2 - Language-->Objective-C Automatic Reference Counting,它原本的值是Yes,將它的值改成No(不自動管理內存),就能夠正常編譯運行了(以下截圖所示)。


錯誤的大概意思是,必須爲方法中數組參數分配明確地空間。

四、繼承的工做機制:方法調度和實例變量

方法調度:發送消息時,首先在當前類中查找該方法,若是沒有,則向該方法的superclass中進行查找。

實例變量:從上往下查找?實例變量不存在從新聲明的狀況吧?(⊙o⊙)…不太明。。(脆弱的基類問題?不懂。。mark)

五、linker command failed with exit code 1 (use -v to see invocation)(第六章切割文件時遇到)

參考:http://blog.csdn.net/duxinfeng2010/article/details/8265273

六、@class Tire;     // 使用方法和位置與 #import相似

@class 建立一個前向引用,並聲明只會經過指針來引用該類。能夠經過@class 讓兩個類互相引用。即,在A.h中用@class B,在B.h 中用@class A。但若是用 #import 讓這兩個類互相引用,就會出現編譯錯誤。

七、在敲NSRange這章內容時,遇到一個糾結的問題,經過{5,5}或者NSMakeRange(5,5)給NSRange對象賦值會報錯


實際上是我本身犯傻,照着書copy,將NSRange重定義了,天然會出錯了。

八、方法名前面的 + 與 -

最開始讓我以爲無語的是,objective-c在方法前面加上的+和-,不過如今以爲挺好的,一目瞭然。

+:說明該方法是類方法,一般用於建立新的實例。例如,+ (id)stringWithFormat:(NSString *)format,...;

-:該方法爲實例方法,咱們直接在類中定義的起必定做用的方法。

九、NSArray的兩個限制:只能存儲objective-c對象,不能存儲原始c數據類型;不能存儲nil。

十、NSEnumerator 數組循環報錯問題

NSArray *array = @[@"marong",@"hello"];
        NSEnumerator *enumerator = [array objectEnumerator];
        id thingie = [enumerator nextObject];
        while (thingie) {
            NSLog(@"I found %@", thingie);
            thingie = [enumerator nextObject];
        }
書中將 
id thingie = [enumerator nextObject];

while表達式中,報錯,我將該句移到循環體外面,並在循環體內加上迭代語句,而後正常。

十一、可變string、可變array和可變dictionary

十二、NSNull,只有一個方法:+(NSNull *)null;

1三、這麼一個小程序也能讓我以爲有趣啊

#import <Foundation/Foundation.h>

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

    @autoreleasepool {
        
        NSFileManager *manager;
        manager = [NSFileManager defaultManager];
        
        NSString *home;
        home = [@"~" stringByExpandingTildeInPath];
        
        NSDirectoryEnumerator *direnum;
        direnum = [manager enumeratorAtPath:home];
        
        NSMutableArray *files;
        files = [NSMutableArray arrayWithCapacity:42];
        
        NSString *filename;
        while (filename = [direnum nextObject]) {
            if ([[filename pathExtension] isEqualTo: @"jpg"]) {
                [files addObject:filename];
            }
        }
        
        NSEnumerator *fileenum;
        fileenum = [files objectEnumerator];
        
        while (filename = [fileenum nextObject]) {
            NSLog(@"%@",filename);
        }
        
    }
    return 0;
}
我發現我對所謂JS的各類特效愈來愈不耐煩,若是再沒有一個統一的標準,日漸龐大而臃腫的JS隊伍最終將潰不成軍。一個寫後臺的同事問我,你爲何不寫程序啊,我以爲你挺適合寫程序的,你爲何選擇切頁面這種工做呢?是的,把時間都花在無謂的特效與動畫上,而遺忘了本身的本質,不論是在別人眼中仍是在你本身內心,永遠都只是個切頁面的。

無謂身邊人如何唱衰IOS,不過我卻以爲有意思起來。沒有太多奇葩兼容的苦惱,雖然也要兼容低版本系統,但是相比web和android的兼容問題,那都是毛毛雨。系統現成的特效,能夠把更多地精力花在業務邏輯和性能優化上,畢竟總得走的更遠一點,只作一個程序員仍是欠缺點什麼。

1四、關於快速枚舉的一點不明:filewalkerV2實例中的片斷

快速枚舉使用的語法:
for ( Type newVariable in expression ) { statements }
for ( existingItem in expression ) { statements }
枚舉期間對象不能被改變。
使用快速枚舉的三個類:
NSArray, NSDictionary, NSSet

快速枚舉的特性:能夠將已有的NSEnumerator 對象或其子類傳遞給它。

NSFileManager *manager;
        manager = [NSFileManager defaultManager];
        
        NSString *home;
        home = [@"~" stringByExpandingTildeInPath];
        
        NSMutableArray *files;
        files = [NSMutableArray arrayWithCapacity:50];
        
        // [manager enumeratorAtPath:home] 的返回值類型爲 NSDirectoryEnumerator
        for (NSString *filename in [manager enumeratorAtPath:home]) {
            if ([[filename pathExtension] isEqualTo: @"jpg"]){
                [files addObject:filename];
            }
        }
        
        for (NSString * filename in files) {
            NSLog(@"%@", filename);
        }

1五、內存管理,很不明,mark

如今貌似用不到書上也就是後面截圖那些了,自動生成的main函數中都會有下面這段代碼:

@autoreleasepool {
    // do something here       
}



1六、使用 NSString 的 convenience initializer 方法initWithContentsOfFile讀取文件

int main(int argc, const char * argv[])
{    
    NSFileManager *manager;
    manager = [NSFileManager defaultManager];
    
    NSString *home;
    home = [@"~" stringByExpandingTildeInPath];
    
    NSLog(@"%@", home);
    NSString *path;
    path = [NSString stringWithFormat:@"%@/Documents/studyfile/資料網站蒐集.txt", home];
    
    NSString *filestring;
    filestring = [[NSString alloc]
                  initWithContentsOfFile: path];
    
    NSLog(@"%@", filestring);
     
    return 0;
}

不知道有沒有哪裏寫錯了, ,等學的深一點了再回頭來檢查好了。反正log裏面木有問題就是,哈哈。

1七、指定初始化函數 designated initializer 的實際應用

#import <Foundation/Foundation.h>

@interface Tire : NSObject
{
    float pressure;
    float treadDepth;
}

- (id) initWithPressure: (float) pressure
              treadDepth: (float) treadDepth;

- (id) initWithPressure: (float) pressure;

- (id) initWithTreadDepth: (float) treadDepth;

@end

@implementation Tire
// 注意
- (id) init
{
    if (self = [self initWithPressure:34 treadDepth:20]){
    }
    
    return self;
}

- (id) initWithPressure:(float) p treadDepth:(float) t
{
    if (self = [super init]){
        pressure = p;
        treadDepth = t;
    }
    return (self);
}

- (id) initWithPressure:(float) p
{
    if (self = [self initWithPressure:p treadDepth:20]){
    }
    return (self);
}

- (id) initWithTreadDepth: (float) t
{
    if (self = [self initWithPressure:34 treadDepth:t]){
    }
    return (self);
}

- (NSString *) description
{
    NSString *desc;
    desc = [NSString stringWithFormat:@"Tire : Pressure : %.1f , TreadDepth : %.1f", pressure, treadDepth];
    return (desc);
}

@end

@interface TireSub : Tire
{
    float sub1;
    float sub2;
}

@end

@implementation TireSub
// 注意子類的 init 方法
- (id) init
{
    if (self = [super initWithPressure:34 treadDepth:20]){
        sub1 = 59;
        sub2 = 69;
    }
    return (self);
}

- (NSString *) description
{
    NSString *desc;
    desc = [NSString stringWithFormat:@"Tire : Pressure : %.1f , TreadDepth : %.1f, Sub1 : %.1f, Sub2 : %.1f", pressure, treadDepth,sub1,sub2];
    return (desc);
}
    
@end

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

    @autoreleasepool {
        
        TireSub *tiresub = [[TireSub alloc] init];
        NSLog(@"%@", tiresub);
        
    }
    return 0;
}

1八、Property 實例

#import <Foundation/Foundation.h>

@interface MRProperty : NSObject
{
    NSString *name ;
    float address;
}

@property NSString *name;
@property float num;
@property(copy) NSString *string;              // for object type
@property(retain) NSMutableArray *array;       // for object type
@property NSString *secondName;
@property(readonly) NSString *lover;


- (id) initWithName: (NSString *) name
            address: (float) num;

@end

@implementation MRProperty  // !  Incomplete implementation

@synthesize name;
@synthesize num;

@synthesize string;
@synthesize array;

@synthesize secondName = second;
@synthesize lover;


- (id) init
{
    if ([self = self initWithName: @"ma" num: 40.0]) {
    }
    return (self);
}

- (id) initWithName: (NSString *) n num: (float) a
{
    if (self = [super init]) {
        name = [n copy];
        num = a;
        
        second = @"rong";
        lover = @"zsl";
    }
    return (self);
}

@end

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

    @autoreleasepool {
        
        MRProperty *property = [[MRProperty alloc] initWithName:@"ma" num:40];
        
        property.string = @"Hi, my love!~";
        
        NSLog(@"name is %@ ; num is %.1f ; string is %@.", property.name, property.num, property.string);
        NSLog(@"my second name is : %@", property.secondName);
        
        NSLog(@"my lover is : %@", property.lover);
    }
    return 0;
}

1九、category   (類別)

感受須要多用才能更明白一點。。。

20、protocol (協議)

我把它理解爲 java裏面的接口,在定義類時聲明須要實現哪些接口。(⊙o⊙)…不知道對伐。哎呦,爲啥我以爲java裏面的接口更好理解呢?

protocol的聲明示例以下:

@protocol Panel <NSObject>
// 必須實現
- (id) create;
// 可選
@optional
- (void) drawCicle;
- (void) drawDoted;
- (void) drawRect;
// 必須實現
@required
- (void) clearPanel;

@end

protocol的使用示例以下:

#import <Foundation/Foundation.h>
#import "Panel.h"

@interface Engine : NSObject <NSCopying,NSCoding>
@end

protocol的使用示例以下:

// 跟在id以後,要求對象遵照指定的協議
- (void) setObjectValue: (id<NSCopying>) obj;
// 用協議修飾方法的參數
- (void) draft: (Person<BaseballPlayer> *person);

2一、block (塊)

        int (^square_block)(int number) = ^(int number) {return (number * number);};
        int result = square_block(5);
        NSLog(@"%d",result);
        
        typedef double (^MKSampleMultiplyBlockRef)(double a, double b);  
        MKSampleMultiplyBlockRef multiply = ^(double a,double b){ return a * b;};
        MKSampleMultiplyBlockRef add = ^(double a,double b){ return a + b;};
        
        double a = 20, b = 40;
        __block double c = 3;
        MKSampleMultiplyBlockRef multiply2 = ^(double a, double b) {c = a * b;};
        // 若是不聲明 __block ,則編譯時會出錯。
        // 沒有長度的可變數組 和 沒有長度的結構體 沒法被聲明爲 __block 類型
        NSLog(@"%f",multiply(a,b));
        NSLog(@"%f",add(a,b));

block能夠定義不少函數塊,惟一的限制是這些函數塊能擁有的參數只能是定義時的形參,不過它可使用的變量的範圍卻很廣。

全局變量、全局函數、封閉範圍內的參數、函數級別的__block變量、封閉範圍內的非靜態變量會被獲取爲常量、objective-c的實例變量、代碼塊內部的本地變量

2二、併發性

// 又是須要深究的一章

2三、文件讀取和寫入

屬性列表類,包括:NSArray、NSDirectory、NSString、NSNumber、NSDate、NSData

NSDate *date = [NSDate date];
        NSLog(@"today is %@", date);
        
        NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24 * 60 * 60)];
        NSLog(@"yesterday is %@", yesterday);
        
        const char *string = "hi, there, this is a c string!";
        NSData *data = [NSData dataWithBytes:string length: strlen(string) + 1];
        NSLog(@"data is %@", data);
        
        NSLog(@"%d byte string is '%s'", [data length], [data bytes]);
        
        NSArray *phrase;
        phrase = [NSArray arrayWithObjects:@"l", @"seem", @"to",@"be", @"very", @"sad" , nil];
        [phrase writeToFile:@"/Users/marong/Documents/test.txt" atomically:YES];
        // atomically 是否先寫入緩衝區,(寫入成功後再替換原文件,可避免寫入失敗損壞源文件,但須雙倍磁盤空間)
        NSArray *phrase2;
        phrase2 = [NSArray arrayWithContentsOfFile:@"/Users/marong/Documents/test.txt"];
        NSLog(@"%@", phrase2);

// 2013-07-08 12:28:09.181 File[936:303] today is 2013-07-08 04:28:09 +0000
// 2013-07-08 12:28:09.181 File[936:303] yesterday is 2013-07-07 04:28:09 +0000
// 2013-07-08 12:28:09.182 File[936:303] data is <68692c20 74686572 652c2074 68697320 69732061 20632073 7472696e 672100>
// 2013-07-08 12:28:09.182 File[936:303] 31 byte string is 'hi, there, this is a c string!'
// 2013-07-08 12:28:09.183 File[936:303] (
    l,
    seem,
    to,
    be,
    very,
    sad
)

2四、經過NSCoding協議編碼和解碼對象

// 表示又不太明白,腦子有點糊里糊塗的感受了

2五、提供邏輯上有意義的值,自定製空值:

-setNilValueForKey:

2六、處理未定義的鍵(可重寫默認方法)

-valueForUndefinedKey:

-setValue:forUndefinedKey;

2七、簡單鍵值操做示例

Car *car;
        car = [[Car alloc] initWithName:@"car1" modelYear:1988 numberOfDoors:1 mileage:1980.0];
        
        NSLog(@"%@", car);
        
        NSLog(@"%@", [car valueForKey:@"name"]);
        // valueForKey : 查找 -key 或 -isKey 命名的get方法,入不存在,則查找 對象內部名爲 _key 或key 的實例變量。
        // c或c++中沒法進行該操做
        
        [car setValue:@"Harold" forKey:@"name"];
        [car setValue: [NSNumber numberWithInt: 1988]
               forKey:@"modelYear"];
        
        NSLog(@"%@", car);
        
        [car setValue: [NSNumber numberWithFloat: 29.98]
               forKeyPath:@"engine.horsepower"];
        
        NSLog(@"%@", [car valueForKeyPath:@"engine.horsepower"]);
        NSLog(@"%@", [car valueForKeyPath:@"tires"]);
        // 若是路徑中含有一個數組屬性,則該鍵路徑的其他部分將被髮送給數組的每一個對象
        
        NSNumber *num = [car valueForKeyPath:@"tires.@count"];
        NSLog(@"car has %d tires", num);
        // @count, @blah, @interface,@avg,@sum,@min,@max,@distinctUnionOfObjects (改變全部屬性)

//Car-Value-Coding[2680:303] car1 , a 1988 1 1980.0 has 4 tires.
//Car-Value-Coding[2680:303] car1
//Car-Value-Coding[2680:303] Harold , a 1988 1 1980.0 has 4 tires.
//Car-Value-Coding[2680:303] 29.98
//Car-Value-Coding[2680:303] (
//    tires0,
//    tires1,
//    tires2,
//    tires3
//)
//Car-Value-Coding[2680:303] car has 1223 tires

2八、NSPredicate:數組運算符 -- の,須要深刻理解


2九、NSPredicate:SELF

 NSArray *array = [NSArray arrayWithObjects:@"marong1", @"marong2", @"marong3", nil]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN {'Herbie', 'marong1', 'marong2'}"]; NSArray *result; result = [array filteredArrayUsingPredicate:predicate]; NSLog(@"%@", result); //NSPredicate[3008:303] ( // marong1, // marong2 //) 

3一、@synchronized(object){ // critical section}  

// 確保不一樣線程會連續訪問臨界區的代碼 (mark,關於併發性即多線程問題,不太明

當object爲nil時,靜態分析器將會發出警告。

@synchronize(mutex,atomic) // 系統自動生成,保證getter和setter方法互斥

3一、新手注意事項大集合

    1》id類型:在Objective-C 中,id 類型是一個獨特的數據類型。在概念上,相似Java 的Object 類,能夠轉換爲任何數據類型。換句話說,id 類型的變量能夠存聽任何數據類型的對象。在內部處理上,這種類型被定義爲指向對象的指針,其實是一個指向這種對象的實例變量的指針。(參考:http://blog.csdn.net/lonelyroamer/article/details/7711895)

    2》在類的interface中,沒有參數的方法後面不加冒號;

    3》[super 方法名: 參數];   // 在override superclass中的某個方法時,須要在方法最後面加上這句調用superclass中的該方法。

    4》self = [super init]    // 相關解釋以下所示:

     5》繼承&複合:inheritance & composition:is & has

     6》accessors :存取器

相關文章
相關標籤/搜索