iOS 개발 지식

7050 단어

get 요청 및post 요청


사용자의 프라이버시 데이터를 제출하려면 POST 요청을 사용해야 합니다. POST 요청에 비해 GET 요청의 모든 매개 변수는 URL에 직접 노출됩니다. 요청한 URL은 일반적으로 서버의 액세스 로그에 기록되고 서버의 액세스 로그는 해커 공격의 주요 대상 중 하나입니다.여기서 말하는 사용자의 프라이버시 데이터는 일반적으로 로그인 비밀번호, 은행 계좌 등을 가리킨다.

URL에서 중국어를 쓸 수 없습니다.


코드를 바꾸는 방식으로 해결할 수 있다
urlStr= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

하나의 실례가 특정한 하위 유형에 속하는지 아닌지를 어떻게 판단합니까


형식 조작부 (is) 를 사용하여 판단할 수 있습니다. 만약 실례가 그 하위 형식에 속한다면, 형식 조작부호는true를 되돌려주고, 반칙은false를 되돌려줍니다.
let str = "abcdef"
if str is String 
{
        print("string")
}
else
{
        print("noString")
}

모든 셀을 훑어보다

for(NSIndexPath *cellIndex in [self.tableView indexPathsForVisibleRows])
TableViewCell *otherCell = [self.tableView cellForRowAtIndexPath:cellIndex];

창고와 더미의 이해


관리 방식: 창고에 대해 말하자면 컴파일러가 자동으로 관리하기 때문에 우리가 수동으로 제어할 필요가 없다.더미에 대해 말하자면, 방출 작업은 프로그래머가 제어하기 때문에memory leak가 생기기 쉽다.신청 크기: 창고: Windows에서 창고는 낮은 주소로 확장된 데이터 구조로 연속적인 메모리 영역입니다.이 말은 창고 꼭대기의 주소와 창고의 최대 용량은 시스템이 미리 정한 것으로 WINDOWS에서 창고의 크기는 2M(1M이라고 할 수도 있고 어쨌든 컴파일할 때 정해진 상수)이며 신청한 공간이 창고의 남은 공간을 초과하면 오버플로우를 제시한다.따라서 창고에서 얻을 수 있는 공간은 비교적 작다.더미: 더미는 높은 주소로 확장된 데이터 구조로 불연속적인 메모리 영역입니다.이것은 시스템이 체인 테이블로 저장된 빈 메모리 주소이기 때문에 자연히 연속적이지 않고 체인 테이블의 역행 방향은 낮은 주소에서 높은 주소로 된다.더미의 크기는 컴퓨터 시스템에서 유효한 가상 메모리에 제한을 받는다.이를 통해 알 수 있듯이 쌓은 공간은 비교적 유연하고 크다.파편 문제: 무더기로 말하자면 빈번한 new/delete는 반드시 메모리 공간의 불연속을 초래하여 대량의 파편을 만들어 프로그램 효율을 떨어뜨릴 것이다.창고에 대해 말하자면 이 문제는 존재하지 않을 것이다. 창고는 선진적인 대기열이기 때문에 그들은 이렇게 일일이 대응하기 때문에 영원히 메모리 블록이 창고 중간에서 분배 방식을 꺼낼 수 없다. 더미는 모두 동적 분배이고 정적 분배가 없는 더미이다.창고에는 두 가지 분배 방식이 있는데 그것이 바로 정적 분배와 동적 분배이다.정적 분배는 컴파일러가 완성한 것이다. 예를 들어 국부 변수의 분배 등이다.동적 분배는 alloca 함수로 분배되지만 창고의 동적 분배와 더미는 다르다. 그의 동적 분배는 컴파일러가 방출하기 때문에 우리가 수동으로 실현할 필요가 없다.분배 효율: 창고는 기계 시스템이 제공하는 데이터 구조로 컴퓨터는 밑에 창고에 지원을 제공한다. 전문적인 레지스터 창고의 주소를 분배하고 창고를 압축하고 창고를 나가면 모두 전문적인 명령이 집행되기 때문에 창고의 효율이 비교적 높다.더미는 C/C++ 함수 라이브러리에서 제공하는 것으로 그 메커니즘은 매우 복잡하다.
요컨대, 운영체제는 stack 단락의 바늘 값을 사용하여heap 단락의 대상에 접근한다.stack 대상의 바늘이 없으면heap의 대상은 접근할 수 없습니다.이것도 메모리 유출의 원인이다.
assign에서 얻은 b는 창고와 더미가 모두 a와 같다.retain에서 얻은 b는 창고에 다시 주소를 개설하고 a와 함께 창고에 있는 내용을 관리한다.copy에서 얻은 b는 창고와 더미가 모두 새로운 주소를 개척한다.

guard의 사용

// , , 
guard let id = person["id"]else
{
    print(" , ")
    return
}
// , 
      print(" :\(id), :\(examNumber)。 !")

여기서 주의해야 할 것은 id와 examNumber는guard 문장 밖에서 사용할 수 있다는 것이다. 즉, guard가 표현식을 검증한 후에 id와 examNumber는 전체 방법의 작용 영역에서 사용할 수 있고 패키지를 해제한 것이다.

tableview 왼쪽 공백 처리


ios7에서는 UITableViewCell 왼쪽에 기본 15픽셀이 비어 있습니다.이때 setSeparator Inset: UIEDge InsetsZero를 설정하면 공백을 제거할 수 있습니다.그러나 ios8에서 setSeparator Inset: UIEDge Insets Zero를 설정하는 것은 이미 작용하지 않습니다.다음은 해결 방법입니다. 우선viewDidLoad 방법에 다음 코드를 추가합니다.
 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}

그리고 UITableView 프록시 방법에 다음 코드를 추가합니다.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}

UIVIEW의 Clips To Bounds와 CALayer의 masks To Bounds 사이??


clipsToBounds는 보기의 하위 보기를 가리키며 상위 보기의 부분을 초과하면 캡처하고, masksToBounds는 보기의 도면층의 하위 도면층을 가리키며, 상위 도면층의 부분을 초과하면 캡처합니다.

이미지의 스트레칭 방법

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:

GCD에 대한 일반적인 방법

//  
let workingQueue = dispatch_queue_create("my_queue", nil)

//  ,GCD  
dispatch_async(workingQueue) {
    //   workingQueue  
    print(" ")
    NSThread.sleepForTimeInterval(2)  //  

    dispatch_async(dispatch_get_main_queue()) {
        //   UI
        print(" ,  UI")
    }
}

다중 스레드 단례

dispatch_once_t static 
// , , 
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
   //  
});

시간에 대한 매크로

#define NSEC_PER_SEC 1000000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull

NSEC: 。
USEC: 。
SEC: 
PER: 

    1   NSEC_PER_SEC, 。
    2   USEC_PER_SEC, 。( )
    3   NSEC_PER_USEC, 。

mac 사용 기교


Mac에서 어떤 디렉터리에 있는 파일과 하위 디렉터리가 각각 얼마나 많은 공간을 차지하는지 알고 싶으면 하나하나 볼 필요가 없습니다.터미널을 열고 이 디렉터리에 입력: du-sh*, 결과가 무엇인지 시험해 보면 알 수 있습니다
처음에 Mac을 사용하기 시작한 많은 사용자들이 일반적으로 Spotlight 기능을 알고 파일을 신속하게 포지셔닝하고 검색한다.사실 이 기능으로 프로그램을 빨리 열 수 있다.ctrl+space 호출을 통해 통신이나cont를 입력하면 이 프로그램을 찾을 수 있습니다. 리턴하면 열 수 있습니다.
shift+command+3: 전체 화면 캡처;shift+command+4: 마우스를 통해 캡처를 선택합니다.
1. Mac의 원생 입력법은 제가 Mac 아래에서 FIT, 수색개, QQ, QIM 등 많은 입력법을 사용한 적이 있습니다. 이것은 Mac의 원생 입력법이 너무 힘이 없기 때문입니다.그러나 OS X가 Mountain Lion으로 업그레이드된 후에 원생 입력법이 크게 개선되었다. 천천히, 현재 가장 자주 사용하는 것은 원생 입력법이 되었다. 오늘은 여러분에게 맥 입력법의 조작 기교 중 영문 혼합 입력을 소개할 것이다. 중국어를 입력할 때capslock키를 켜면 영어를 직접 입력할 수 있고 끄고 다시 중국어 선택어로 전환할 수 있다. -+호를 통해 글자나 단어를 전환할 수 있다.[]를 통해 후보 단어 목록을 전개하고 열기 입력법 선호 설정을 전환할 수 있으며, 자동 교정 모호음을 설정할 수 있다.'수동 분사를 할 수 있다. 예를 들어 fang'an(방안)은shift+6를 적용하여 이모티콘을 입력할 수 있다. 예를 들어 (☆_☆)철-철
2. Safari의 탭은 새로운 탭에서 웹 페이지를 열려면command 키를 누르고 링크를 누르면 멀티터치 제스처로 탭을 전환할 수 있습니다.터치패드에서 두 손가락을 열면 탭이 표시됩니다.탭 보기에서 두 손가락 가볍게 훑어보면 서로 다른 탭은shift+command+좌우 방향 키를 통해 Safari에서 열린 탭에서 빠르게 전환할 수 있습니다.

글로벌 인쇄 설정

#ifdef DEBUG
#define DMLog(...)NSLog(@"%s%@",__PRETTY_FUNCTION__,[NSString stringWithFormat:__VA_ARGS__])
#else
#define DMLog(...) do { } while (0)
#endif

Xcode 콘솔에서 LLDB 유형의 인쇄 지원

  • touch ~/.lldbinit
  • echo display @import UIKit >> ~/.lldbinit
  • echo target stop-hook add -o "target stop-hook disable">> ~/.lldbinit 삭제는 사실 간단명료합니다. 첫 번째 명령 터치 ~/를 보십시오.lldbinit는 루트 디렉터리에 숨겨진 파일을 만들었습니다.lldbinit, 그리고 이 파일을 삭제하면 됩니다.터미널을 열고 터미널에 rm~/를 입력하십시오.lldbinit 명령이면 됩니다

  • 프로그램이 백그라운드에서 오래 실행되도록 하는 예제 코드:

    // AppDelegate.h  
    @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;
    
    // AppDelegate.m  
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        [self beingBackgroundUpdateTask];
        //  
        [self endBackgroundUpdateTask];
    }
    
    - (void)beingBackgroundUpdateTask
    {
        self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [self endBackgroundUpdateTask];
        }];
    }
    
    - (void)endBackgroundUpdateTask
    {
        [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
        self.backgroundUpdateTask = UIBackgroundTaskInvalid;
    }
    

    좋은 웹페이지 즐겨찾기